// 包声明：将Test类放在com.itheima.extends6constructor包下，方便组织和管理代码
package com.itheima.extends6constructor;

// 定义一个公共的Test类，public表示这个类可以被其他包访问
public class Test {
    // main方法：Java程序的入口点，程序从这里开始执行
    // public：公共访问权限
    // static：静态方法，可以直接通过类名调用
    // void：无返回值
    // String[] args：命令行参数数组
    public static void main(String[] args) {
        // 注释：这里说明了这段代码的学习目标，是为了认识子类构造器的特点和应用场景
        // 注释：解释了一个重要规则：当创建子类对象时，子类构造器会先调用父类构造器，然后再执行自己的代码
        // 创建一个Zi类的对象，变量名是z
        // 这里会触发构造方法的执行，由于Zi继承自Fu，会先执行Fu的构造方法，再执行Zi的构造方法
        Zi z = new Zi();
    }
    // main方法结束
}
// Test类结束

// 定义一个Zi类，它继承自Fu类
// extends关键字表示继承关系，Zi是子类(派生类)，Fu是父类(基类)
class Zi extends Fu {
    // Zi类的无参构造方法
    // public：公共访问权限
    // Zi()：构造方法名与类名相同，没有返回值
    public Zi() {
        // super()：调用父类的无参构造方法
        // 这行代码默认存在，即使不写编译器也会自动添加
        // 这体现了子类构造器必须先调用父类构造器的规则
        // super(); // 默认存在的，写不写都有！
        // super(666)：如果想调用父类的有参构造方法，可以这样写
        // 注意：如果显式调用了super()或super(参数)，编译器就不会再自动添加无参的super()
        // super(666); // 指定调用父类的有参数构造器。
        // 打印一条消息，显示子类无参构造器被执行了
        // 这行代码在父类构造器执行完毕后才会执行
        System.out.println("子类无参构造器执行了");
    }
    // Zi类无参构造方法结束
}
// Zi类结束

// 定义一个Fu类，它是Zi类的父类
class Fu {
    // Fu类的无参构造方法
    // public：公共访问权限
    // 当创建子类对象时，如果子类构造器没有显式调用父类构造器，就会默认调用这个无参构造器
    public Fu() {
        // 打印一条消息，显示父类无参构造器被执行了
        System.out.println("父类无参构造器执行了");
    }
    // Fu类无参构造方法结束

    // Fu类的有参构造方法
    // public：公共访问权限
    // int a：构造方法的参数，接收一个整数
    // 只有当子类构造器显式调用super(参数)时才会执行这个构造方法
    public Fu(int a) {
        // 打印一条消息，显示父类有参构造器被执行了
        System.out.println("父类有参构造器执行了");
    }
    // Fu类有参构造方法结束
}
// Fu类结束
